<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件
function alert($msg = '',$url = '',$icon = '',$time = 3){
    $str = '<script type="text/javascript" src="'.config('static').'/admin/js/jquery-1.8.2.min.js"></script><script type="text/javascript" src="'.config('static').'/lib/layer/2.4/layer.js"></script>';//加载jquery和layer
    $str .= '<script>$(function(){layer.msg("'.$msg.'",{icon:'.$icon.',time:'.($time*1000).'});setTimeout(function(){parent.location.href="'.$url.'";},2000)});</script>';//主要方法
    return $str;
}

/**
 * 发送消息
 * @param int $user_id 接受者id *必传
 * @param string $title 发送标题 *必传
 * @param string $content 发送内容 *必传
 * @param int $status 消息状态 默认0
 */
function SendMessage($user_id,$title,$content,$status = 0){

    $message = [];
    $message['user_id'] = $user_id;
    $message['title'] = $title;
    $message['content'] = $content;
    $message['status'] = $status;
    $message['create_time'] = time();

    db('information')->insert($message);
}

/**
 * api接口数据输出
 * @param int $status 业务状态码
 * @param string $message 信息提示
 * @param [] $data 返回数据
 * @param string $msg_code 信息提示码
 * @param int $httpCode http状态码
 * @author 王柯 <wangke.email@foxmail.com>
 * @return \think\response\Json
 */
function show($status,$message,$data = [],$msg_code = '',$httpCode = 200){
    $result = [
        'status' => $status,
        'message' => $message,
        'data' => $data,
        'msg_code' => $msg_code,
    ];
    return json($result,$httpCode);
}

/**
 * 快速创建目录
 * @param $path string 目录路径 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return void
 */
function create_dir($path){
    if(!is_dir($path)){
        exec(sprintf('mkdir %s',escapeshellarg($path)));
    }
}

/**
 * 字符串截取并且超出显示省略号
 * @param string $text 要截取的文本内容 *必传
 * @param int $length 要截取的长度 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * 在模版中调用则：{$vo.title|subtext=18}
 * @return string
 */
function subtext($text, $length){
    if(mb_strlen($text, 'utf8') > $length)
        return mb_substr($text,0,$length,'utf8').' …';
    return $text;
}

/**
 * 图片上传缩略图
 * @param string $fieldName 图片字段名称 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return bool|mixed|string|\think\response\Json
 */
function uploadImage($fieldName){
    $files = request()->file($fieldName);
    //文件保存目录
    $saveDir = ROOT_PATH.'public/static/uploads/'.$fieldName.'/'.date('Ymd');
    if(!empty($files)){
        if(is_array($files)){
            //定义上传文件数组
            $fileArr = [];
            foreach($files as $file){
                if($file->getInfo('size') > config('image.size')){
                    return show(config('code.error'), '图片大小超过限定尺寸！'.(config('image.size')/(1024*1024)).'M');
                }

                $image_type = array_slice(explode('.',$file->getInfo('name')),-1,1)[0];

                if(!in_array(strtolower($image_type),config('image.type'))){
                    return show(config('code.error'), '上传格式不正确！');
                }

                $image = \think\Image::open($file);

                //快速创建目录
                create_dir($saveDir);

                //文件名
                $file_name = $saveDir . '/'
                    . md5(rand(0,time())*1000) .
                    '.' . $image->type();

                $res = $image->thumb(500, 500)->save($file_name);

                $str = ROOT_PATH . 'public/static';
                $path = str_replace($str, '', $file_name);
                if ($res) {
                    $fileArr[] = $path;
                } else {
                    return show(config('code.error'),$image->getError());
                }
            }
            return json_encode($fileArr);
        }elseif(is_object($files)){
            if($files->getInfo('size') > config('image.size')){
                return show(config('code.error'), '图片大小超过限定尺寸！');
            }

            $image_type = array_slice(explode('.',$files->getInfo('name')),-1,1)[0];

            if(!in_array(strtolower($image_type),config('image.type'))){
                return show(config('code.error'), '上传格式不正确！');
            }

            $image = \think\Image::open($files);

            //快速创建目录
            create_dir($saveDir);

            //文件名
            $file_name = $saveDir . '/'
                . md5(rand(0,time())*1000) .
                '.' . $image->type();

            $res = $image
                ->thumb(500, 500)
                ->save($file_name);

            $str = ROOT_PATH . 'public/static';
            $path = str_replace($str, '', $file_name);
            if ($res) {
                return $path;
            } else {
                return show(config('code.error'),$image->getError());
            }
        }else{
            return show(config('code.error'),'未知错误！');
        }
    }
}

/**
 * 删除图片
 * @param string|array $filePath 要删除的文件路径 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return void
 */
function delImages($filePath){
    if(is_array($filePath)){
        foreach ($filePath as $key => $val) {
            //删除旧图片（多图删除）
            if (file_exists(ROOT_PATH.'public/static'.$filePath[$key])) {
                unlink(ROOT_PATH.'public/static'.$filePath[$key]);
            }
        }
    }else{
        //删除旧图片（单图删除）
        $file = ROOT_PATH.'public/static'.$filePath;
        if(file_exists($file)){
            unlink($file);
        }
    }
}

/**
 * 检查删除文件上级空目录检查是否为空为空删除
 * @param string $filePath 文件路径 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return void
 */
function checkFileParentDir($filePath){
    if(is_array($filePath)){
        foreach ($filePath as $key => $val){
            $arr[$key] = explode('/',ROOT_PATH.'public/static'.$filePath[$key]);

            //获取目录结构数组
            array_pop($arr[$key]);

            //获取目录结构路径
            $dirPath = implode('/',$arr[$key]);

            //删除空目录
            delEmptyDir($dirPath);
        }
    }else{
        $arr = explode('/',ROOT_PATH.'public/static'.$filePath);

        //获取目录结构数组
        array_pop($arr);

        //获取目录结构路径
        $dirPath = implode('/',$arr);

        //删除空目录
        delEmptyDir($dirPath);
    }
}

/**
 * 删除目录时检查上级目录是否为空目录并删除上级空目录
 * @param string $dirPath 目录路径 *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return void
 */
function delEmptyDir($dirPath)
{
    if(is_dir($dirPath)){
        $array = scandir($dirPath);
        //上级目录
        $dir = dirname($dirPath);
        foreach ($array as $key => $val) {
            if ($val == '.' || $val == '..') {
                unset($array[$key]);
            }
        }

        if (empty($array)) {
            $result = rmdir($dirPath);
            if ($result) {
                delEmptyDir($dir);
            }
        }
    }
}

/**
 * curl请求
 * @param $url string 请求地址
 * @param $data array 提交的字符串
 * @param $method string 请求方式默认POST请求
 * @param $iscer boolean 是否带证书请求默认false如果带证书参数为true（此参数对于地址为https协议的请求）
 * @author 王柯 <wangke.email@foxmail.com>
 * @return mixed
 */
function curlRequest($url,$data,$method = 'post',$is_cer = false){
    //初始化CURL句柄
    $ch = curl_init();

    //设置请求的URL
    curl_setopt($ch,CURLOPT_URL,$url);

    //设为TRUE把curl_exec()结果转化为字串，而不是直接输出
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

    //设置请求方式
    curl_setopt($ch,CURLOPT_CUSTOMREQUEST,strtoupper($method));

    //设置HTTP头信息
    curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-HTTP-Method-Override: $method"));

    //带证书请求https
    if($is_cer){
        //是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

        //是否检测服务器的域名与证书上的是否一致
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

        //证书类型，"PEM" (default), "DER", and"ENG".
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');

        //私钥类型，"PEM" (default), "DER", and"ENG".
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');

        //证书密码
        curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'1502407281');
        //cert证书
        curl_setopt($ch,CURLOPT_SSLCERT,EXTEND_PATH.'/wxpay/cert/apiclient_cert.pem');

        //私钥key
        curl_setopt($ch,CURLOPT_SSLKEY,EXTEND_PATH.'/wxpay/cert/apiclient_key.pem');
    }else
        //不带证书
        {
        //是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

        //是否检测服务器的域名与证书上的是否一致
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
    }

    //设置提交的数据
    curl_setopt($ch,CURLOPT_POSTFIELDS, $data);

    //运行curl
    $result = curl_exec($ch);

    //关闭句柄
    curl_close($ch);

    return $result;
}

if (!function_exists('parseAttr')) {
    /**
     * 解析数组
     * @param string $value 配置值
     * @author 王柯 <wangke.email@foxmail.com>
     * @return array|string
     */
    function parseAttr($value = '') {
        $array = preg_split('/[,;\r\n]+/', trim($value, ",;\r\n"));
        if (strpos($value, ':')) {
            $value  = array();
            foreach ($array as $val) {
                list($k, $v) = explode(':', $val);
                $value[$k]   = $v;
            }
        } else {
            $value = $array;
        }
        return $value;
    }
}


if (!function_exists('systemConfig')) {
    /**
     * 更新获取后台系统配置信息
     * @param  string $name 配置名
     * @param  bool $update 是否更新缓存
     * @author 王柯 <wangke.email@foxmail.com>
     * @return mixed
     */
    function systemConfig($name = '', $update = false)
    {
        $result = cache('system_config');

        if (!$result || $update == true) {
            $configs = db('system_config')->field('en_name,default_value,config_type')->select();
            $result = [];
            foreach ($configs as $config) {
                $result[$config['en_name']] =  $config['default_value'];
            }

            cache('system_config', $result);
        }

        return $name != '' ? $result[$name] : $result;
    }
}

/**
 * 过滤掉emoji表情
 * @author 王柯 <wangke.email@foxmail.com>
 * @return mixed|null|string|string[]
 */
function filterEmoji($str){
    $str = preg_replace_callback('/./u',
        function (array $match) {
            return strlen($match[0]) >= 4 ? '' : $match[0];
        },$str);
    return $str;
}

/**
 * 数组分页
 * @param array $array 数组 *必传
 * @param int $page 获取的页数
 * @param int $count 获取的数据条数
 * @author 王柯 <wangke.email@foxmail.com>
 * @return array
 */
function arrayPage($array,$page = '',$count = ''){
    //当次获取总数
    $count = $count ? $count : 5;

    //判断当前页面是否为空 如果为空就表示为第一页面
    $page = $page ? $page : 1;

    //计算每次分页的开始位置
    $start = ($page - 1) * $count;

    //分页数据
    $data = array_slice($array, $start, $count);

    return $data;
}



/**
 * 下载备份文件
 * @param string $fileName *必传
 * @author 王柯 <wangke.email@foxmail.com>
 * @return void
 */
function downloadFile($fileName){
    $fileName = iconv('UTF-8','GB2312',$fileName);
    if (file_exists($fileName)){
        ob_end_clean();
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Length: ' . filesize($fileName));
        header('Content-Disposition: attachment; filename=' . basename($fileName));
        readfile($fileName);
    }else{
        exit(alert('文件不存在！',url('index/index'),5,3));
    }
}


/**
 * 表单提交过滤特殊字符
 * @author 巫玉梅 <1120504614@qq.com>
 * @return
 */
function special_str($arr){
    $data = [];
    foreach($arr as $key => $val){
        if(is_string($val)){
            $data[$key] = trim($val);
        }else{
            $data[$key] = $val;
        }
    }
    return $data;
}